#include <iostream>
#include <cassert>
#include <pthread.h>
#include <unistd.h>
#include "RingQueue.hpp"

void *consume(void *args)
{
    RingQueue<int> *prq = (RingQueue<int>*)args;

    // 消费者死循环读取数据
    int data;
    while(true)
    {
        prq->pop(&data);
        std::cout << "消费数据：" << data << std::endl;
        // sleep(1);
    }

    return nullptr;
}

void *product(void *args)
{
    RingQueue<int> *prq = (RingQueue<int>*)args;

    // 生产者死循环发布数据
    int a = 0;
    while(true)
    {
        std::cout << "生产数据：" << a << std::endl;
        prq->push(a);   // 发布数据
        a++;
        sleep(1);
    }

    return nullptr;
}

int main()
{
    RingQueue<int> *prq = new RingQueue<int>();

    pthread_t c[2], p[3];   // 生产者消费者线程id

    // 创建生产者和消费者线程
    pthread_create(p, nullptr, product, (void*)prq);
    pthread_create(p + 1, nullptr, product, (void*)prq);
    pthread_create(p + 2, nullptr, product, (void*)prq);
    pthread_create(c, nullptr, consume, (void*)prq);
    pthread_create(c + 1, nullptr, consume, (void*)prq);

    // 等待线程退出
    pthread_join(c[0], nullptr);
    pthread_join(c[1], nullptr);
    pthread_join(p[0], nullptr);
    pthread_join(p[1], nullptr);
    pthread_join(p[2], nullptr);

    return 0;
}